草庐IT

Lua 垃圾回收

全部标签

java - 如何减少网络垃圾的产生?

我有一个使用netty框架编写的处理大约40kmsg/sec的网络应用程序,我想减少垃圾收集器调用的次数。在分析时我发现有大量的byte[]实例,我怀疑它来自这部分代码:publicclassMessageHandlerextendsSimpleChannelHandler{publicvoidmessageReceived(ChannelHandlerContextctx,finalMessageEvente){ChannelBuffermessage=(ChannelBuffer)e.getMessage();}}是否有可能强制netty以某种方式重用/池ChannelBuffer

java - GC 是否从 Metaspace 收集垃圾?

我一直认为垃圾收集器只清除堆,现在我这么认为。在java8中,permGen被删除并被Metaspace取代。据我所知,Metaspace是垃圾收集器(https://stackoverflow.com/a/24075360/2674303)谁从Metaspace收集垃圾? 最佳答案 我认为您的困惑源于口语化的术语“垃圾收集”,该术语被广泛使用但并未真正描述托管环境中发生的情况。内存管理是一个复杂的过程,它被简化为:识别哪些对象是垃圾,其实就是判断哪些对象可达(读作:不是垃圾),没有遇到的都认为是垃圾如有必要,将对象引用排队到引用队

java - JVM 垃圾收集 - 跟踪年轻一代中的 Activity 对象

在收集年轻代内存时,JVM收集器仅扫描属于年轻代的那些根对象(堆中可直接从根集中访问的对象),并使用写屏障支持的卡表/memset来确定区域老一代的对象可能包含对年轻一代对象的引用。我的问题是,如果年轻收集器确定年轻代中的特定对象只有来自老年代对象的单个外部引用,它如何知道老年代对象本身不是垃圾,因此使年轻代对象“存活”并且不符合收集条件吗?例如,可能有一条从根集直接到老年代对象的路径,而老年代对象又引用了所说的年轻一代对象。年轻收集器通常认为这个年轻代对象是活的,还是在决定忽略/收集它之前如何确定指向它的老年代对象是否是活的/垃圾? 最佳答案

java - Java 垃圾收集器可以随机删除堆上层中的对象吗?

Ehcache的文档指出堆层受Java垃圾收集的约束(与堆外层和磁盘存储相反)。那么,这是否意味着Heap层中的对象可以被GC自发删除?显然,当它们过期或空间不足时,它们会被Ehcache删除——这是一种明确定义的行为。但最重要的是,GC能否就这样随机杀死一些对象,甚至不将它们移到较低层? 最佳答案 GC不会收集Activity对象,即isreachablefromalivethread的对象.堆上Ehcache存储中的对象是可访问的,因此不会被收集。Ehcache曾经尝试使用WeakReference但accordingtothi

Java 垃圾收集器 : top object classes promoted (by size)?

请告诉我在每次年轻GC事件之后确定提升到老年代的年轻代内存组成的最佳方法是什么?理想情况下,我想知道负责的类名,比如每个“年轻一代->老一代”提升block中80%的堆;例子:我有600M的younggen,每个tenure提升6M;我想知道这个6M是由哪些对象组成的。谢谢。 最佳答案 没有简单的方法可以做到这一点,但是,我最近一直在分析大型java应用程序的内存性能,并且可以分享一些经验。以下是我如何找到哪些对象被提升到老一代:首先,您需要确定“旧/永久”空间中有哪些对象。这基本上就是标准的Java堆分析。为此,我推荐jmap。它

java - 在 Java 中如何查看哪些对象已被垃圾回收?

请问,有什么方法可以获取在Java中被垃圾回收的对象的历史记录(它们的变量或至少是类名)?只需添加这些参数(到OracleJVM)-verbose:gc-XX:+PrintGCDetails-XX:+PrintGCTimeStamps不提供任何其他字节的内存。对我的帮助非常有限。感谢所有回复。注意:不幸的是,使用addfinilize()方法的解决方法对我来说不是一个选项(我无权访问它)。 最佳答案 您可以使用Object的finalize方法。当对象即将被GC时调用此方法。从这里,您可以记录所需的信息。

java - 为什么 Major 垃圾回收比 Minor 慢?

通过这个link但仍然对次要和主要GC收集中实际发生的事情感到困惑。假设我在年轻一代中有100个对象,其中85个对象是无法访问的对象。现在当MinorGC运行时,它将回收85个对象的内存并将15个对象移动到较旧的(永久的)代。现在老年代有15个Activity对象,其中3个是不可访问的。假设MajorGC发生了。它会保持15个对象,并为3个无法访问的对象回收内存。据说主要GC比次要GC慢。我的问题是为什么?是不是因为majorGC发生的对象数量通常比minor多,因为minorgc比major发生得更频繁?根据理解majorGC应该更快,因为它需要做的工作更少即从无法访问的对象中回收内

java - 删除未使用的字段是否会导致垃圾回收?

对于涉及异步操作的库,我必须保持对对象的引用,直到满足特定条件。(我知道,这听起来很不寻常。所以这里有一些上下文,尽管它可能并不严格相关:该对象可能被认为是一个directByteBuffer,它用于JNI操作。JNI操作将获取缓冲区的地址。此时,该地址只是一个“指针”,不被视为对字节缓冲区的引用。该地址可能会被使用异步地,稍后时间。因此,必须防止缓冲区被垃圾收集,直到JNI操作完成。)为了实现这一点,我实现了一个基本上等同于此的方法:privatestaticvoidkeepReference(finalObjectobject){Runnablerunnable=newRunnab

java - 在垃圾收集中可关闭?

当Closeable对象被垃圾回收时,是否调用了Closeable接口(interface)的close()方法?[在Java6.0中]我有一个静态变量,它是一个资源(数据库连接)。由于这是一个静态资源,因此没有正确的地方可以显式调用close()。 最佳答案 快速回答:不。GC根本不关心Closeable。Java确实有protectedvoidfinalize()throwsThrowable{}方法,您可以重写它—它将在GC上调用。它有点工作,例如在FileInputStream中:/***Ensuresthattheclos

java - JVM 垃圾回收

一般来说(据我所知,Oracle/sun和其他第三方以及MS都有一个标准的JVM实现),JVM是否只创建一个作为守护进程运行的垃圾收集线程来收集垃圾对象,或者JVM生成多个线程来完成垃圾收集? 最佳答案 通过-XX:+UseParallelGC启用的“吞吐量收集器”是默认收集器,使用多线程。使用-XX:+UseConcMarkSweepGC启用的“并发低暂停收集器”使用一个线程作为并发收集器,但它的stop-the-world收集器是并行的。只有很少使用的单线程gc-XX:+UseSerialGC是单线程的。http://www.o